package br.com.locasis.funcionalidades;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.international.StatusMessage.Severity;
import org.jboss.seam.international.StatusMessages;

import br.com.locasis.entity.Automovel;
import br.com.locasis.entity.ManutencaoVeiculo;
import br.com.locasis.entity.TipoManutencao;

@Name("cadastrarManutencao")
@Scope(ScopeType.CONVERSATION)
//@Restrict(value="#{identity.hasRole('"+PerfilUsuario.PERFIL_PETSHOP+"')}")
public class CadastrarManutencao {
	
	@In(create=true)
	private EntityManager entityManager;
	
	@In(value = "statusMessages")
	protected StatusMessages messages;
	
	private ManutencaoVeiculo manutencaoEdicao;
	
	private List<ManutencaoVeiculo> listaManutencoes;
	
	@Out(required=false)
	private ManutencaoVeiculo manutencaoSelecionado;
	
	private boolean selecionadoTodos;
	
	private Automovel automovelPesquisa;
	
	private List<Automovel> listaAutomoveis;
	
	private Automovel automovelSelecionado;
	
	private Integer idTipoSelecionado;
	
	private List<SelectItem> listaTiposManutencao;

	public List<SelectItem> getListaTiposManutencao() {
		if (listaTiposManutencao == null) {
			listaTiposManutencao = new ArrayList<SelectItem>();
			listaTiposManutencao.add(new SelectItem(null,"Selecione"));
			List<TipoManutencao> lista = entityManager.createQuery("select t from TipoManutencao t where t.flgAtivo is true").getResultList();
			for(TipoManutencao t : lista){
				listaTiposManutencao.add(new SelectItem(t.getIdTipoManutencao(),t.getNome()));
			}
		}
		return listaTiposManutencao;
	}

	public void setListaTiposManutencao(List<SelectItem> listaTiposManutencao) {
		this.listaTiposManutencao = listaTiposManutencao;
	}

	public Integer getIdTipoSelecionado() {
		return idTipoSelecionado;
	}

	public void setIdTipoSelecionado(Integer idTipoSelecionado) {
		this.idTipoSelecionado = idTipoSelecionado;
	}

	public Automovel getAutomovelSelecionado() {
		if (automovelSelecionado == null) {
			automovelSelecionado = new Automovel();
		}
		return automovelSelecionado;
	}

	public void setAutomovelSelecionado(Automovel automovelSelecionado) {
		this.automovelSelecionado = automovelSelecionado;
	}

	public List<Automovel> getListaAutomoveis() {
		if (listaAutomoveis == null) {
			listaAutomoveis = new ArrayList<Automovel>();
		}
		return listaAutomoveis;
	}

	public void setListaAutomoveis(List<Automovel> listaAutomoveis) {
		this.listaAutomoveis = listaAutomoveis;
	}

	public Automovel getAutomovelPesquisa() {
		if (automovelPesquisa == null) {
			automovelPesquisa = new Automovel();
		}
		return automovelPesquisa;
	}

	public void setAutomovelPesquisa(Automovel automovelPesquisa) {
		this.automovelPesquisa = automovelPesquisa;
	}

	public ManutencaoVeiculo getManutencaoEdicao() {
		if (manutencaoEdicao == null) {
			manutencaoEdicao = new ManutencaoVeiculo();
		}
		return manutencaoEdicao;
	}

	public void setManutencaoEdicao(ManutencaoVeiculo manutencaoEdicao) {
		this.manutencaoEdicao = manutencaoEdicao;
	}
	
	public List<ManutencaoVeiculo> getListaManutencoes() {
		if (listaManutencoes == null) {
			listaManutencoes = new ArrayList<ManutencaoVeiculo>();
		}
		return listaManutencoes;
	}

	public void setListaManutencoes(List<ManutencaoVeiculo> listaManutencoes) {
		this.listaManutencoes = listaManutencoes;
	}
	
	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	public void selecionarAutomovel(Automovel automovel){
		automovelSelecionado = automovel;
		listaManutencoes = entityManager.createQuery("select m from ManutencaoVeiculo m where m.flgAtivo is true and m.automovel.idAutomovel = :idAutomovel")
			.setParameter("idAutomovel", automovel.getIdAutomovel())
			.getResultList();
	}
	
	public void pesquisaAutomoveis(){
		StringBuffer query = new StringBuffer("select a from Automovel a where a.flgAtivo is true ");
		if(getAutomovelPesquisa().getMarca() != null &&
				!getAutomovelPesquisa().getMarca().isEmpty()){
			query.append("and UPPER(a.marca) = UPPER(:marca)");
		}
		if(getAutomovelPesquisa().getModelo() != null &&
				!getAutomovelPesquisa().getModelo().isEmpty()){
			query.append("and UPPER(a.modelo) = UPPER(:modelo)");
		}
		if(getAutomovelPesquisa().getPlaca() != null &&
				!getAutomovelPesquisa().getPlaca().isEmpty()){
			query.append("and UPPER(a.placa) = UPPER(:placa)");
		}
		if(getAutomovelPesquisa().getCor() != null &&
				!getAutomovelPesquisa().getCor().isEmpty()){
			query.append("and UPPER(a.cor) = UPPER(:cor)");
		}
		if(getAutomovelPesquisa().getChassi() != null &&
				!getAutomovelPesquisa().getChassi().isEmpty()){
			query.append("and UPPER(a.chassi) = UPPER(:chassi)");
		}
		if(getAutomovelPesquisa().getAnoModelo() != null){
			query.append("and UPPER(a.anoModelo) = UPPER(:anoModelo)");
		}
		if(getAutomovelPesquisa().getAnoFabricacao() != null){
			query.append("and UPPER(a.anoFabricacao) = UPPER(:anoFabricacao)");
		}
		
		Query qryResult = entityManager.createQuery(query.toString());
		
		if(getAutomovelPesquisa().getMarca() != null &&
				!getAutomovelPesquisa().getMarca().isEmpty()){
			qryResult.setParameter("marca", getAutomovelPesquisa().getMarca());
		}
		if(getAutomovelPesquisa().getModelo() != null &&
				!getAutomovelPesquisa().getModelo().isEmpty()){
			qryResult.setParameter("modelo", getAutomovelPesquisa().getModelo());
		}
		if(getAutomovelPesquisa().getPlaca() != null &&
				!getAutomovelPesquisa().getPlaca().isEmpty()){
			qryResult.setParameter("placa", getAutomovelPesquisa().getPlaca());
		}
		if(getAutomovelPesquisa().getCor() != null &&
				!getAutomovelPesquisa().getCor().isEmpty()){
			qryResult.setParameter("cor", getAutomovelPesquisa().getCor());
		}
		if(getAutomovelPesquisa().getChassi() != null &&
				!getAutomovelPesquisa().getChassi().isEmpty()){
			qryResult.setParameter("chassi", getAutomovelPesquisa().getChassi());
		}
		if(getAutomovelPesquisa().getAnoModelo() != null){
			qryResult.setParameter("anoModelo", getAutomovelPesquisa().getAnoModelo());
		}
		if(getAutomovelPesquisa().getAnoFabricacao() != null){
			qryResult.setParameter("anoFabricacao", getAutomovelPesquisa().getAnoFabricacao());
		}
		
		listaAutomoveis = qryResult.getResultList();
	}
	
	public void selecionaTodos(){
		for(ManutencaoVeiculo a : getListaManutencoes()){
			if(isSelecionadoTodos()){
				a.setSelecionado(true);
			}else{
				a.setSelecionado(false);
			}
		}
	}

	public void onLoad(){
		setListaManutencoes(null);
		if(manutencaoSelecionado != null){
			manutencaoEdicao = manutencaoSelecionado;
		}
	}
	
	public void onLoadList(){
		setManutencaoEdicao(null);
		manutencaoSelecionado = null;
	}

	public String salvar(){
		getManutencaoEdicao().setTipoManutencao(entityManager.find(TipoManutencao.class, getIdTipoSelecionado()));
		getManutencaoEdicao().setFlgAtivo(true);
		getListaManutencoes().add(entityManager.merge(getManutencaoEdicao()));
		entityManager.flush();
		messages.add(Severity.INFO,"Manutenção cadastrada com sucesso.");
		setManutencaoEdicao(null);
		setIdTipoSelecionado(null);
		return "persisted";
	}
	
	public String cancelar(){
		setManutencaoEdicao(null);
		return "voltar";
	}
	
	public void excluir(){
		List<ManutencaoVeiculo> listaRemocao = new ArrayList<ManutencaoVeiculo>();
		for(ManutencaoVeiculo a : getListaManutencoes()){
			if(a.isSelecionado()){
				a.setFlgAtivo(false);
				entityManager.merge(a);
				listaRemocao.add(a);
			}
		}
		getListaManutencoes().removeAll(listaRemocao);
		entityManager.flush();
		messages.add(Severity.INFO,"Manutenção(ões) excluída(s) com sucesso.");
	}
	
	public String novo(){
		getManutencaoEdicao().setAutomovel(automovelSelecionado);
		return "novo";
	}
	
	public String editar(ManutencaoVeiculo manutencao){
		manutencaoSelecionado = manutencao;
		return "editar";
	}
	
	public boolean exibeBotaoNovo(){
		return getAutomovelSelecionado() != null &&
				getAutomovelSelecionado().getIdAutomovel() != null;
	}
}
